# Prepare data for Leaflet map
community_board_map_data <- st_transform(community_board_analysis, 4326)
pal_accessibility <- colorNumeric(palette = "RdYlGn", domain = community_board_map_data$PercentParksAccessible, reverse = FALSE)
pal_income <- colorFactor(palette = c("#d73027", "#fc8d59", "#91bfdb", "#4575b4"),
levels = c("Low Income", "Lower-Middle", "Upper-Middle", "High Income"))
pal_density <- colorFactor(palette = c("#ffffcc", "#a1dab4", "#41b6c4", "#225ea8"),
levels = c("Low Density", "Medium-Low", "Medium-High", "High Density"))
create_cb_popup <- function(data) {
lapply(1:nrow(data), function(i) {
HTML(paste0(
"<div style='font-family: Arial; min-width: 280px;'>",
"<h3 style='color: #2c3e50; border-bottom: 2px solid #3498db;'>", data$CommunityBoardLabel[i], "</h3>",
"<p><strong>", data$Location[i], "</strong></p>",
"<div style='background: #ecf0f1; padding: 10px; margin: 8px 0; border-radius: 5px;'>",
"<strong>🏞️ Park Accessibility</strong><br/>",
"<span style='font-size: 24px; font-weight: bold; color: ",
ifelse(data$PercentParksAccessible[i] > 25, "#27ae60", ifelse(data$PercentParksAccessible[i] > 15, "#f39c12", "#e74c3c")),
";'>", data$PercentParksAccessible[i], "%</span> accessible<br/>",
"Parks with facilities: <strong>", data$ParksWithAccessibleFacilities[i], " of ", data$TotalParks[i], "</strong><br/>",
"Total facilities: <strong>", data$TotalAccessibleFacilities[i], "</strong><br/>",
"Park acres: <strong>", format(data$TotalAcres[i], big.mark = ","), "</strong></div>",
"<div style='background: #e8f5e9; padding: 10px; margin: 8px 0; border-radius: 5px;'>",
"<strong>👥 Demographics</strong><br/>",
"Median Income: <strong>$", format(data$MedianIncome[i], big.mark = ","), "</strong><br/>",
"Income Level: <strong>", data$IncomeQuartile[i], "</strong><br/>",
"Population: <strong>", format(round(data$Population[i]), big.mark = ","), "</strong><br/>",
"Density: <strong>", data$DensityQuartile[i], "</strong></div></div>"
))
})
}
cb_popups <- create_cb_popup(community_board_map_data)
interactive_accessibility_map <- leaflet() %>%
addProviderTiles(providers$CartoDB.Positron, group = "Light") %>%
addPolygons(
data = community_board_map_data,
fillColor = ~pal_accessibility(PercentParksAccessible),
weight = 2, opacity = 1, color = "white", fillOpacity = 0.7,
highlightOptions = highlightOptions(weight = 3, color = "#666", fillOpacity = 0.9),
popup = cb_popups,
label = ~lapply(paste0(CommunityBoardLabel, ": ", PercentParksAccessible, "% accessible"), HTML),
group = "Accessibility %"
) %>%
addPolygons(
data = community_board_map_data,
fillColor = ~pal_income(IncomeQuartile),
weight = 2, opacity = 1, color = "white", fillOpacity = 0.7,
highlightOptions = highlightOptions(weight = 3, color = "#666", fillOpacity = 0.9),
popup = cb_popups,
label = ~lapply(paste0(CommunityBoardLabel, ": ", IncomeQuartile), HTML),
group = "Income Level"
) %>%
addPolygons(
data = community_board_map_data,
fillColor = ~pal_density(DensityQuartile),
weight = 2, opacity = 1, color = "white", fillOpacity = 0.7,
highlightOptions = highlightOptions(weight = 3, color = "#666", fillOpacity = 0.9),
popup = cb_popups,
label = ~lapply(paste0(CommunityBoardLabel, ": ", DensityQuartile), HTML),
group = "Population Density"
) %>%
addLegend(pal = pal_accessibility, values = community_board_map_data$PercentParksAccessible,
title = "Accessibility %", position = "bottomright", group = "Accessibility %") %>%
addLegend(pal = pal_income, values = community_board_map_data$IncomeQuartile,
title = "Income Level", position = "bottomright", group = "Income Level") %>%
addLegend(pal = pal_density, values = community_board_map_data$DensityQuartile,
title = "Population Density", position = "bottomright", group = "Population Density") %>%
addLayersControl(
baseGroups = "Light",
overlayGroups = c("Accessibility %", "Income Level", "Population Density"),
options = layersControlOptions(collapsed = FALSE),
position = "topleft"
) %>%
hideGroup(c("Income Level", "Population Density")) %>%
addScaleBar(position = "bottomleft") %>%
setView(lng = -73.935242, lat = 40.730610, zoom = 10)